package fr.generali.sas.dao;

import java.util.List;

import fr.generali.sas.domain.FluxHibernate;
import fr.generali.sas.model.v1_0.Flux;

public interface FluxInternalDao {

	/**
	 * Pour une sycnhro Agence, reserve les flux avant envoi
	 * 
	 * @param codeIntermediaire
	 *            code intermediaire
	 * @param numeroReservation
	 *            identifiant de la demande de synchro
	 * @return nombre de lignes mises à jour
	 */
	public int reserveFluxPourSynchroAgence(String codeIntermediaire,
			String numeroReservation);

	/**
	 * Pour une sycnhro Client, reserve les flux avant envoi
	 * @param codeIntermediaire code de l'intermediaire
	 * @param numeroReservation identifiant de la demande de synchro
	 * @param idClient identifiant du client
	 * @return nombre de lignes reservées
	 */
	public int reserveFluxPourSynchroClient(String codeIntermediaire,
			String numeroReservation, String idClient);
	
	
	/**
	 * retourne la liste de flux pour un client (suite à une synchro Client). 
	 * 
	 * 
	 * @param codeIntermediaire code de l'intermediaire
	 * @param numeroReservation identifiant de la demande de synchro
	 * @return liste de flux suite à une synchro client
	 */
	public List<Flux> getFluxPourSynchroClient(String codeIntermediaire,
			String numeroReservation);
	
	
	/**
	 * retourne la liste de flux pour une agence (suite à une synchro Agence). 
	 * 
	 * @param codeIntermediaire code de l'intermediaire
	 * @param numeroReservation identifiant de la demande de synchro
	 * @return liste de flux suite à une synchro client
	 */
	public List<Flux> getFluxPourSynchroAgence(String codeIntermediaire,
			String numeroReservation);
	
	
	/**
	 * retourne la liste de flux pour un client (suite à une synchro Client). 
	 * Dans ce cas, il s'agit d'un lot (i.e n flux parmi l'ensemble des flux) 
	 * 
	 * @param codeIntermediaire code de l'intermediaire
	 * @param numeroReservation identifiant de la demande de synchro
	 * @param rowLimit nombre de flux dans un lot
	 * @return liste de flux  (il s'agit d'un lot contenant au maximum le nombre de lignes definies par rowLimit)
	 */
	public List<Flux> getFluxPourSynchroClientWithRowLimit(
			String codeIntermediaire, String numeroReservation, int rowLimit);

	/**
	 * retourne la liste de flux pour un client (suite à une synchro Client). 
	 * Dans ce cas, il s'agit d'un lot (i.e n flux parmi l'ensemble des flux)<br/> 
	 * <br/>
	 * Méthode a invoquée quand il faut poursuivre la synchro Client 
	 * 
	 * @param codeIntermediaire code de l'intermediaire
	 * @param numeroReservation identifiant de la demande de synchro
	 * @param rowLimit nombre de flux dans un lot
	 * @param fromId idenfifiant à partir duquel la synchronisation doit se poursuivre
	 * @return
	 */
	public List<Flux> getNextFluxPourSynchroClientWithRowLimit(
			String codeIntermediaire, String numeroReservation, int rowLimit,
			int fromId);

	/**
	 * retourne la liste de flux pour un client (suite à une synchro Agence ). 
	 * Dans ce cas, il s'agit d'un lot (i.e n flux parmi l'ensemble des flux)<br/> 
	 * <br/>
	 * Méthode a invoquée quand il faut poursuivre la synchro Agence 
	 * 
	 * @param codeIntermediaire code de l'intermediaire
	 * @param numeroReservation identifiant de la demande de synchro
	 * @param rowLimit nombre de flux dans un lot
	 * @param fromId idenfifiant à partir duquel la synchronisation doit se poursuivre
	 * @return
	 */
	public List<Flux> getNextFluxPourSynchroAgenceWithRowLimit(
			String codeIntermediaire, String numeroReservation, int rowLimit,
			
			int fromId);

	/**
	 * retourne la liste de flux pour une agence (suite à une synchro Agence). 
	 * Dans ce cas, il s'agit d'un lot (i.e n flux parmi l'ensemble des flux) 
	 * 
	 * @param codeIntermediaire code de l'intermediaire
	 * @param numeroReservation identifiant de la demande de synchro
	 * @param rowLimit nombre de flux dans un lot
	 * @return liste de flux  (il s'agit d'un lot contenant au maximum le nombre de lignes definies par rowLimit)
	 */
	public List<Flux> getFluxPourSynchroAgenceWithRowLimit(
			String codeIntermediaire, String numeroReservation, int rowLimit);

	
	
	/**
	 * @param codeIntermediaire
	 * @param numeroReservation
	 * @param statut
	 * @return
	 */
	public int acquitteIntegrationFlux(String codeIntermediaire,
			String numeroReservation, boolean statut);

	/**
	 * retourne le nombre total de flux pour une reservation donnée
	 * 
	 * @param codeIntermediaire identifiant de l'intermediaire
	 * @param numeroReservation identifiant de reservation
	 * @return nombre de flux
	 */
	public int getNbFluxForReservation(String codeIntermediaire, String numeroReservation);

	
	
	/**
	 * @param f
	 * @return
	 * @throws Exception
	 */
	public FluxHibernate save(FluxHibernate f) throws Exception;

	

}